import gradio as gr  # 导入gradio库用于创建GUI
from dotenv import load_dotenv  # 导入环境变量加载器

# 首先加载环境变量
load_dotenv()

from config import Config  # 导入配置管理模块
from hacker_news_client import HackerNewsClient
from readwise_client import ReadwiseClient  # 导入Readwise客户端
from report_generator import ReportGenerator  # 导入报告生成器模块
from llm import LLM  # 导入可能用于处理语言模型的LLM类
from logger import LOG  # 导入日志记录器

# 创建各个组件的实例
config = Config()
hacker_news_client = HackerNewsClient(config) # 创建 Hacker News 客户端实例，传递配置
readwise_client = ReadwiseClient(config) # 创建 Readwise 客户端实例，传递配置



def generate_hn_hour_topic(model_type, model_name):
    config.llm_model_type = model_type

    if model_type == "openai":
        config.openai_model_name = model_name
    else:
        config.ollama_model_name = model_name

    llm = LLM(config)  # 创建语言模型实例
    report_generator = ReportGenerator(llm, config.report_types)  # 创建报告生成器实例

    markdown_file_path = hacker_news_client.export_top_stories()
    report, report_file_path = report_generator.generate_hn_topic_report(markdown_file_path)

    return report, report_file_path  # 返回报告内容和报告文件路径

def generate_readwise_analysis(model_type, model_name, location, category, days_back):
    """
    生成Readwise阅读分析报告

    Args:
        model_type: AI模型类型
        model_name: AI模型名称
        location: 文档位置 ('feed', 'archive', 'later')
        category: 文档类别 (可选)
        days_back: 获取天数

    Returns:
        tuple: (报告内容, 报告文件路径)
    """
    try:
        # 配置AI模型
        config.llm_model_type = model_type
        if model_type == "openai":
            config.openai_model_name = model_name
        else:
            config.ollama_model_name = model_name

        llm = LLM(config)
        report_generator = ReportGenerator(llm, config.report_types)

        # 处理类别参数
        if category and category.lower() == 'all':
            category = None

        # 获取Readwise数据
        file_path = readwise_client.export_reading_summary(
            location=location,
            category=category,
            days_back=days_back
        )

        if not file_path:
            return "❌ 无法获取Readwise数据，请检查API Token配置", ""

        # 生成AI分析报告
        report, report_file = report_generator.generate_readwise_report(file_path)

        return report, report_file

    except ValueError as e:
        if "API Token" in str(e):
            return "❌ Readwise API Token未配置，请在.env文件中设置READWISE_API_TOKEN", ""
        else:
            return f"❌ 配置错误：{str(e)}", ""
    except Exception as e:
        return f"❌ 生成Readwise分析时发生错误：{str(e)}", ""


# 定义一个回调函数，用于根据 Radio 组件的选择返回不同的 Dropdown 选项
def update_model_list(model_type):
    if model_type == "openai":
        return gr.Dropdown(choices=["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"], label="选择模型")
    elif model_type == "ollama":
        return gr.Dropdown(choices=["llama3.1", "gemma2:2b", "qwen2:7b"], label="选择模型")


# 创建 Gradio 界面
with gr.Blocks(title="智能信息分析平台") as demo:


    # 创建 Hacker News 热点话题 Tab
    with gr.Tab("Hacker News 热点话题"):
        gr.Markdown("## Hacker News 热点话题")  # 添加小标题

        # 创建 Radio 组件
        model_type = gr.Radio(["openai", "ollama"], label="模型类型", info="使用 OpenAI GPT API 或 Ollama 私有化模型服务")

        # 创建 Dropdown 组件
        model_name = gr.Dropdown(choices=["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"], label="选择模型")

        # 使用 radio 组件的值来更新 dropdown 组件的选项
        model_type.change(fn=update_model_list, inputs=model_type, outputs=model_name)

        # 创建按钮来生成报告
        button = gr.Button("生成最新热点话题")

        # 设置输出组件
        markdown_output = gr.Markdown()
        file_output = gr.File(label="下载报告")

        # 将按钮点击事件与导出函数绑定
        button.click(generate_hn_hour_topic, inputs=[model_type, model_name,], outputs=[markdown_output, file_output])

    # 创建 Readwise 阅读分析 Tab
    with gr.Tab("📚 Readwise阅读分析"):
        gr.Markdown("## Readwise阅读洞察分析")
        gr.Markdown("分析您的Readwise阅读内容，生成AI驱动的阅读洞察和知识管理建议。")

        with gr.Row():
            with gr.Column(scale=2):
                # AI模型配置
                readwise_model_type = gr.Radio(
                    ["openai", "ollama"],
                    label="模型类型",
                    value="openai",
                    info="选择用于分析的AI模型"
                )

                readwise_model_name = gr.Dropdown(
                    choices=["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"],
                    label="选择模型",
                    value="gpt-4o-mini"
                )

                # Readwise配置
                location_input = gr.Dropdown(
                    choices=["feed", "archive", "later"],
                    label="文档位置",
                    value="feed",
                    info="选择要分析的文档位置"
                )

                category_input = gr.Dropdown(
                    choices=["all", "rss", "article", "pdf", "epub", "tweet", "email"],
                    label="文档类别",
                    value="all",
                    info="选择要分析的文档类别（all表示所有类别）"
                )

                days_back_input = gr.Slider(
                    minimum=1,
                    maximum=30,
                    value=7,
                    step=1,
                    label="分析天数",
                    info="分析最近多少天的阅读内容"
                )

                readwise_generate_btn = gr.Button(
                    "🚀 生成阅读洞察报告",
                    variant="primary",
                    size="lg"
                )

            with gr.Column(scale=1):
                gr.Markdown("### 📖 功能说明")
                gr.Markdown("""
                **Readwise阅读分析功能**：

                🎯 **核心功能**：
                - 获取Readwise阅读数据
                - AI智能分析阅读内容
                - 生成个性化洞察报告

                📊 **分析维度**：
                - 阅读主题分布
                - 知识连接发现
                - 学习趋势分析
                - 行动建议生成

                🔧 **配置要求**：
                - 需要配置READWISE_API_TOKEN
                - 支持多种文档类型
                - 可自定义分析时间范围
                """)

        # 模型类型变化时更新模型选择
        readwise_model_type.change(
            fn=update_model_list,
            inputs=readwise_model_type,
            outputs=readwise_model_name
        )

        # 输出组件
        readwise_output = gr.Markdown(label="阅读洞察报告")
        readwise_file_output = gr.File(label="下载报告文件")

        # 绑定生成按钮事件
        readwise_generate_btn.click(
            fn=generate_readwise_analysis,
            inputs=[
                readwise_model_type,
                readwise_model_name,
                location_input,
                category_input,
                days_back_input
            ],
            outputs=[readwise_output, readwise_file_output]
        )


if __name__ == "__main__":
    demo.launch(share=True, server_name="0.0.0.0")  # 启动界面并设置为公共可访问
    # 可选带有用户认证的启动方式
    # demo.launch(share=True, server_name="0.0.0.0", auth=("django", "1234"))